package dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import utilClasses.ListaPermisija;
import utilClasses.uPermisije;

public class daoPermisije {
	static void kreirajPermisiju(String naziv) throws SQLException {
		Connection c = daoKonekcija.dajKonekciju();
		CallableStatement cStmt = c.prepareCall("{CALL Insert_Permisije(?)}");
		cStmt.setString(1, naziv);
		cStmt.execute();
		cStmt.close();
		c.close();
	}

	static int dajidPermisije(String naziv) throws SQLException {
		Connection c = daoKonekcija.dajKonekciju();
		PreparedStatement ps = c
				.prepareStatement("SELECT idpermisije FROM permisije WHERE nazivPermisije=?");
		ps.setString(1, naziv);
		ResultSet rs = ps.executeQuery();
		if (!rs.next())
			return -1;
		int rez = rs.getInt(1);
		rs.close();
		ps.close();
		c.close();
		return rez;

	}

	public static String insertPermisija(String naziv, String rola)
			throws SQLException {

		try {
			Integer idPermisije = dajidPermisije(naziv);
			if (idPermisije == -1) {
				kreirajPermisiju(naziv);
			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.print(e.getMessage());
			return new Boolean(false).toString();
		}
		return new Boolean(true).toString();
	}

	public static ListaPermisija dajPermisije(String user) throws SQLException {
		Connection c = daoKonekcija.dajKonekciju();
		ListaPermisija rez = new ListaPermisija();
		try {
			CallableStatement cStmt = c
					.prepareCall("{CALL dajOdredjenePermisije(?)}");
			cStmt.setString(1, user);

			ResultSet rs = cStmt.executeQuery();
			while (rs.next()) {
				String permisija = rs.getString(1);
				String jelIma = rs.getString(2);
				System.out.print(permisija);
				rez.getPermisije().add(new uPermisije(permisija, jelIma));

			}
			rs.close();
			cStmt.close();
			c.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			if (c != null)
				c.close();
			e.printStackTrace();
		}

		return rez;
	}

	/*public static ListaPermisija dajSamoPermisijeKojeImam(String user)
			throws SQLException {
		Connection c = daoKonekcija.dajKonekciju();
		ListaPermisija rez = new ListaPermisija();
		try {
			CallableStatement cStmt = c.prepareCall("{CALL OdredjenaPermisija(?)}");
			cStmt.setString(1, user);
			ResultSet rs = cStmt.executeQuery();
			;
			while (rs.next()) {
				String permisija = rs.getString(1);
				System.out.print(permisija);
				rez.getPermisije().add(new uPermisije(permisija, "true"));

			}
			rs.close();
			cStmt.close();
			c.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			if (c != null)
				c.close();
			e.printStackTrace();
		}
		return rez;
	}*/

	/*public static int brojPermisija(String user) throws SQLException {
		Connection c = daoKonekcija.dajKonekciju();
		int rez=0;
		try {
			CallableStatement cStmt = c.prepareCall("{CALL BrojPermisija(?)}");
			cStmt.setString(1, user);
			ResultSet rs = cStmt.executeQuery();
			System.out.println("Uspjesno");

			if (rs.next()) {
				int brper = rs.getInt(1);
				rez= brper;
			}
			rs.close();
			cStmt.close();
			c.close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			if (c != null)
				c.close();
			e.printStackTrace();
			rez=-1;
		}
		return rez;
	}*/



	static int dajOdredjenuPermisiju(String naziv, String rola)
			throws SQLException {
		Connection c = daoKonekcija.dajKonekciju();
		PreparedStatement ps = c.prepareStatement("SELECT * from rolperm as rp, permisije as p WHERE rp.permID=p.idpermisije AND rp.rolID=? AND p.nazivPermisije=?");
		int idRole= daoRole.dajidRole(rola);
		ps.setInt(1, idRole);
		ps.setString(2, naziv);
		ResultSet rs = ps.executeQuery();
		int tmp = -1;
		if (rs.next())
			tmp = 1;
		rs.close();
		ps.close();
		c.close();
		return tmp;
	}

	static void brisiOdredjenuPermisiju(String rola, String naziv)
			throws Exception {
		Connection c = daoKonekcija.dajKonekciju();
		int idPermisije = dajidPermisije(naziv);
		int idRole= daoRole.dajidRole(rola);
		System.out.println(idRole);
		System.out.println(idPermisije);
		if (idPermisije < 0)
			throw new Exception("Nema permisije sa tim ID-em!");
		if (idRole < 0)
			throw new Exception("Nema role sa tim ID-em!");
		CallableStatement cStmt = c
				.prepareCall("{CALL deleteOdredjenuPermisiju(?,?)}");
		cStmt.setInt(1, idRole);
		cStmt.setInt(2, idPermisije);
		cStmt.execute();
		System.out.println("Uspjesno");
		cStmt.close();
		c.close();
	}

	public static String updatePermisija(String naziv, String rola,
			String nebrisem) throws SQLException {
		//Connection c = daoKonekcija.dajKonekciju();
		try {
			int imaLiVeze = dajOdredjenuPermisiju(naziv, rola);
			if (imaLiVeze < 0 && nebrisem.equals("true")) {
				System.out.print("Kreiram");
				daoPermisije.kreirajOdredjenuPermisiju(rola, naziv);
			}
			if (imaLiVeze > 0 && nebrisem.equals("false")) {
				brisiOdredjenuPermisiju(rola, naziv);
				System.out.print("Brisem");
			}
			System.out.print(Integer.toString(imaLiVeze) + nebrisem);
			return new String("true");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return new String("false");
		} catch (Exception e) {

			// TODO Auto-generated catch block
			e.printStackTrace();
			return new String("false");
		}
	}

	static void kreirajOdredjenuPermisiju(String rola, String naziv)
			throws Exception {
		Connection c = daoKonekcija.dajKonekciju();
		CallableStatement cStmt = c
				.prepareCall("{CALL Insert_OdredjenuPermisiju(?,?)}");
		int idRole = daoRole.dajidRole(rola);
		if (idRole < 0)
			throw new Exception("Nema role sa tim ID-em!");
		cStmt.setInt(1, idRole);
		System.out.println(idRole);
		int idPermisije = dajidPermisije(naziv);
		if (idPermisije < 0)
			throw new Exception("Nema permisije sa tim ID-em!");
		cStmt.setInt(2, idPermisije);
		System.out.println(idPermisije);
		cStmt.execute();
		System.out.println("Uspjesno");
		cStmt.close();
		c.close();
	}

	public static boolean provjeri(String korisnik, String permisija) throws SQLException{
		Connection c=daoKonekcija.dajKonekciju();
		PreparedStatement ps = c.prepareStatement("SELECT  'X' " +
												"from " +
												"role r, "+
												"rolperm rp, "+
												"userrole ur, "+
												"permisije p "+
												"WHERE "+
												"r.idrole = ur.rolaID "+
												"and rp.rolID = ur.rolaID "+
												"and p.idpermisije = rp.permID "+
												"and ur.userID = ? "+
												"and p.nazivPermisije = ?");
		ps.setString(1, korisnik);
		ps.setString(2, permisija);
		ResultSet rs=ps.executeQuery();
		boolean rez=false;
		if(rs.next()) rez=true;
		c.close();
		return rez;
		
	}
}
